#
#   Example 4
#

from plex import *

def begin_comment(scanner, text):
    scanner.nesting_level = scanner.nesting_level + 1

def end_comment(scanner, text):
    scanner.nesting_level = scanner.nesting_level - 1

def maybe_a_name(scanner, text):
    if scanner.nesting_level == 0:
        return 'ident'

letter = Range("AZaz")
digit = Range("09")
name = letter + Rep(letter | digit)
space = Any(" \t\n")

lexicon = Lexicon([
    (Str("(*"), begin_comment),
    (Str("*)"), end_comment),
    (name,      maybe_a_name),
    (space,     IGNORE)
])

filename = "example4.in"
f = open(filename, "r")
scanner = Scanner(lexicon, f, filename)
scanner.nesting_level = 0
while 1:
    token = scanner.read()
    print token
    if token[0] is None:
        break
